Atomics, CyclicBarrier, এবং CountDownLatch সবই Java বা মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে থ্রেড সমন্বয় এবং সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয়। তবে এই তিনটি টুলের কাজের পদ্ধতি এবং উদ্দেশ্য আলাদা। যেখানে Atomics মূলত ডেটার অ্যাটমিক অপারেশন পরিচালনা করতে ব্যবহৃত হয়, CyclicBarrier এবং CountDownLatch থ্রেড সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয়, যাতে একাধিক থ্রেড নির্দিষ্ট সময় বা শর্ত পূর্ণ করার পরে একসাথে কাজ করতে পারে।
এই টুলগুলো একে অপরের সাথে মিলিতভাবে কাজ করতে পারে, যেখানে Atomics ব্যবহার করা হয় শেয়ার করা ডেটার সঠিকতা এবং নিরাপত্তা নিশ্চিত করতে, এবং CyclicBarrier বা CountDownLatch ব্যবহার করা হয় থ্রেডগুলোর সমন্বয় এবং সিঙ্ক্রোনাইজেশন নিশ্চিত করতে।
Atomics এবং CountDownLatch
CountDownLatch হল একটি সিঙ্ক্রোনাইজার ক্লাস যা একাধিক থ্রেডের মধ্যে কাজ সমন্বয় করতে ব্যবহৃত হয়। এটি বিশেষভাবে ব্যবহার করা হয় যখন থ্রেডগুলোর মধ্যে একটি নির্দিষ্ট সংখ্যা কাজ শেষ হওয়ার জন্য অপেক্ষা করতে হয়। একবার CountDownLatch-এর কাউন্ট জিরো হয়ে গেলে, থ্রেডগুলি একসাথে এগিয়ে যেতে পারে।
CountDownLatch এর সাথে Atomics
যখন Atomics ব্যবহার করা হয় শেয়ার করা ডেটা সঠিকভাবে আপডেট করতে, CountDownLatch ব্যবহার করা হতে পারে সব থ্রেডের কাজ একসাথে শেষ হওয়া নিশ্চিত করার জন্য।
ব্যবহার উদাহরণ:
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.CountDownLatch;
public class AtomicsWithCountDownLatch {
public static void main(String[] args) throws InterruptedException {
final int THREAD_COUNT = 5;
AtomicInteger counter = new AtomicInteger(0); // Atomic counter
CountDownLatch latch = new CountDownLatch(THREAD_COUNT);
// Thread to increment counter and then signal the latch
for (int i = 0; i < THREAD_COUNT; i++) {
new Thread(() -> {
counter.incrementAndGet();
latch.countDown(); // Signal that this thread has completed
}).start();
}
latch.await(); // Wait until all threads finish
System.out.println("Final counter value: " + counter.get()); // Expected: 5
}
}
এখানে, AtomicInteger ব্যবহার করা হয়েছে ডেটার সঠিকতা এবং CountDownLatch ব্যবহার করা হয়েছে থ্রেডগুলোর সমন্বয় নিশ্চিত করার জন্য। সব থ্রেড তাদের কাজ শেষ করার পর CountDownLatch তাদের কাজ শেষ হওয়া নির্দেশ করে এবং শেষে Atomic counter এর মান সঠিকভাবে ৫ হয়ে যায়।
Atomics এবং CyclicBarrier
CyclicBarrier হল আরেকটি সিঙ্ক্রোনাইজেশন টুল, যা একাধিক থ্রেডকে নির্দিষ্ট সংখ্যক থ্রেড একত্রে মিলিত হওয়ার জন্য অপেক্ষা করতে বাধ্য করে। এটি সাধারণত ব্যবহার করা হয় যখন আপনাকে থ্রেডগুলির মধ্যে সমন্বয় প্রয়োজন, তবে এটি সঠিকভাবে রিসেটও করা যায় যাতে একাধিক বার ব্যবহার করা যেতে পারে।
CyclicBarrier এর সাথে Atomics
Atomics এর সাথে CyclicBarrier ব্যবহার করা হয় যাতে একাধিক থ্রেড একত্রে কাজ শেষ করার পরে একে অপরকে সঠিকভাবে সিঙ্ক্রোনাইজ করতে পারে, এবং একাধিক থ্রেড তাদের কাজ করার সময় শেয়ার করা ডেটা সঠিকভাবে আপডেট করতে পারে।
ব্যবহার উদাহরণ:
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.CyclicBarrier;
public class AtomicsWithCyclicBarrier {
public static void main(String[] args) throws InterruptedException {
final int THREAD_COUNT = 5;
AtomicInteger counter = new AtomicInteger(0); // Atomic counter
CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT, () -> {
// This will run after all threads reach the barrier
System.out.println("All threads finished. Final counter value: " + counter.get());
});
// Create threads to increment counter
for (int i = 0; i < THREAD_COUNT; i++) {
new Thread(() -> {
counter.incrementAndGet(); // Increment atomic counter
try {
barrier.await(); // Wait for all threads to reach the barrier
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
}
এখানে, CyclicBarrier নিশ্চিত করে যে সব থ্রেড সমানভাবে কাজ শেষ করেছে, এবং তারপর AtomicInteger সঠিকভাবে আপডেট হয়। যখন সব থ্রেড CyclicBarrier-এ পৌঁছায়, তখন barrier.await() থ্রেডগুলিকে একত্রিত করে এবং শেষে শেয়ার করা Atomic counter এর মান প্রদর্শন করা হয়।
Atomics এবং CountDownLatch/CyclicBarrier এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | CountDownLatch | CyclicBarrier | Atomics |
|---|---|---|---|
| উদ্দেশ্য | থ্রেডগুলোর মধ্যে সমন্বয় নিশ্চিত করা যখন নির্দিষ্ট সংখ্যক কাজ সম্পন্ন হয়। | থ্রেডগুলোর মধ্যে সমন্বয় নিশ্চিত করা, এবং এটি পুনরায় ব্যবহারযোগ্য। | শেয়ার করা ডেটা সঠিকভাবে এবং atomicভাবে আপডেট করা। |
| বৈশিষ্ট্য | একবার countDown করা হলে এটি রিসেট করা যায় না। | বারবার রিসেট করা যায়। | লক-মুক্ত অপারেশন দ্বারা ডেটার সঠিকতা নিশ্চিত করা। |
| ব্যবহার | কাজ সমাপ্ত হলে থ্রেডগুলোকে একত্রিত করা। | থ্রেডগুলোকে নির্দিষ্ট সংখ্যক বার একত্রিত হওয়ার জন্য অপেক্ষা করানো। | শেয়ার করা ভেরিয়েবলগুলির উপর অ্যাটমিক অপারেশন সম্পাদন করা। |
| রিটার্ন ভ্যালু | থ্রেড সমাপ্তির পর await() ব্যবহার করা হয়। | থ্রেড সমাপ্তির পর await() ব্যবহার করা হয়। | সাধারণত একটি ভেরিয়েবলের মান রিটার্ন করে। |
| থ্রেড সিঙ্ক্রোনাইজেশন | সব থ্রেড শেষ না হওয়া পর্যন্ত অপেক্ষা করানো। | সব থ্রেড একত্রে সিঙ্ক্রোনাইজ হওয়ার জন্য অপেক্ষা করানো। | একাধিক থ্রেডের মধ্যে নিরাপদভাবে ডেটা শেয়ার করা। |
উপসংহার
- Atomics ব্যবহার করে shared memory ডেটা সঠিকভাবে আপডেট করা যায় এবং race condition প্রতিরোধ করা যায়। এটি লক-মুক্ত অপারেশন সরবরাহ করে, যা পারফরম্যান্সে উন্নতি ঘটায়।
- CountDownLatch এবং CyclicBarrier থ্রেড সিঙ্ক্রোনাইজেশন টুল, যা নিশ্চিত করে যে সমস্ত থ্রেড নির্দিষ্ট সময় বা শর্ত পূর্ণ করার পর একসাথে কাজ শুরু বা শেষ করতে পারে।
- Atomics এবং CountDownLatch/CyclicBarrier একে অপরের সাথে সমন্বয়ে কাজ করতে পারে। Atomics ডেটার সঠিকতা এবং থ্রেড সেফটি নিশ্চিত করে, যখন CountDownLatch এবং CyclicBarrier থ্রেডগুলির মধ্যে সঠিক সমন্বয় এবং সিঙ্ক্রোনাইজেশন বজায় রাখে।